package com.gyj.RedisTest;

import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Created by Gao on 2018/5/16.
 */
public class RedisStudy {

    private static void RedisStringJava() {
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的Redis服务成功！");
        // 设置 redis 字符串数据
        jedis.set("souvc", "http://www.cnblogs.com/liuhongfeng/");
        // 获取存储的数据并输出
        System.out.println("redis存储的字符串是: " + jedis.get("souvc"));
    }

    private static void RedisListJava() {
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的Redis服务成功！");

        // 存储数据到列表中
        jedis.del("kecheng");
        jedis.lpush("kecheng", "java");
        jedis.lpush("kecheng", "php");
        jedis.lpush("kecheng", "Mysql");

        // 获取存储的数据并输出
        List<String> list = jedis.lrange("kecheng", 0, 5);
        for (int i = 0; i < list.size(); i++) {
            System.out.println("redis list里面存储的值是:" + list.get(i));
        }
    }

    private static void RedisListJava2() {
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功！");

        //开始前，先移除所有的内容
        jedis.del("java framework");
        System.out.println(jedis.lrange("java framework", 0, -1));

        //先向key java framework中存放三条数据
        jedis.lpush("java framework", "spring");
        jedis.lpush("java framework", "struts");
        jedis.lpush("java framework", "hibernate");

        //再取出所有数据jedis.lrange是按范围取出，
        // 第一个是key，第二个是起始位置，第三个是结束位置，jedis.llen获取长度 -1表示取得所有
        System.out.println(jedis.lrange("java framework", 0, -1));

        jedis.del("java framework");
        jedis.rpush("java framework", "spring");
        jedis.rpush("java framework", "struts");
        jedis.rpush("java framework", "hibernate");
        System.out.println(jedis.lrange("java framework", 0, -1));
    }

    private static void RedisMapJava() {
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功！");
        //-----添加数据----------
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "xinxin");
        map.put("age", "22");
        map.put("qq", "123456");
        //Redis Hmset命令用于同时将多个field-value(字段-值)对设置到哈希表中。此命令会覆盖哈希表中已存在的字段,如果哈希表不存在，会创建一个空哈希表，并执行 HMSET 操作
        jedis.hmset("user", map);
        //取出user中的name，执行结果:[minxr]-->注意结果是一个泛型的List
        //第一个参数是存入redis中map对象的key，后面跟的是放入map中的对象的key，后面的key可以跟多个，是可变参数
        List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
        System.out.println(rsmap);

        //删除map中的某个键值, Redis Hdel 命令用于删除哈希表key中的一个或多个指定字段，不存在的字段将被忽略
        jedis.hdel("user", "age");
        System.out.println(jedis.hmget("user", "age")); //因为删除了，所以返回的是null
        System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2
        System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true
        System.out.println(jedis.hkeys("user"));//返回map对象中的所有key
        System.out.println(jedis.hvals("user"));//返回map对象中的所有value

        Iterator<String> iter = jedis.hkeys("user").iterator();
        while (iter.hasNext()) {
            String key = iter.next();
            System.out.println(key + ":" + jedis.hmget("user", key));
        }
    }

    private static void RedisSetJava() {

        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功！");
        //Redis的Set是String类型的无序集合。集合成员是唯一的，这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的，所以添加，删除，查找的复杂度都是 O(1)
        //删除map中的某个键值
        //jedis.hdel("user");
        jedis.sadd("user", "liuling");
        jedis.sadd("user", "xinxin");
        jedis.sadd("user", "ling");
        jedis.sadd("user", "zhangxinxin");
        jedis.sadd("user", "who");
        //移除noname
        jedis.srem("user", "who");
        System.out.println(jedis.smembers("user"));          //获取所有加入的value
        System.out.println(jedis.sismember("user", "who"));  //判断 who 是否是user集合的元素
        System.out.println(jedis.srandmember("user"));
        System.out.println(jedis.scard("user"));             //返回集合的元素个数
    }

    private static void RedisSortJava() {
        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功！");

        //jedis 排序
        //此处的rpush和lpush是List的操作。是一个双向链表, 2个命令都是属于无序集合的范畴，并不是有序集合zset等，lpush从左往右添加元素, 在key对应list的头部添加字符串元素
        //rpush从右到左添加元素, 在key对应list的尾部添加字符串元素
        jedis.del("a");        //先清除数据，再加入数据进行测试
        jedis.rpush("a", "1");
        jedis.lpush("a", "6");
        jedis.lpush("a", "3");
        jedis.lpush("a", "9");
        System.out.println(jedis.lrange("a", 0, -1));   //[9, 3, 6, 1]
        System.out.println(jedis.sort("a"));            //[1, 3, 6, 9]
        System.out.println(jedis.lrange("a", 0, -1));   //[9, 3, 6, 1]
    }


    public static void main(String[] args) {
        //RedisStringJava();
        //RedisListJava();
        /*RedisListJava2();
        RedisMapJava();
        RedisSetJava();*/
        RedisSortJava();
    }
}
